package org.example.idempotent.mq;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 幂等注解，防止消息队列消费者重复消费消息
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NoMQDuplicateConsume {

    /**
     * 设置防重令牌 Key 前缀
     */
    String prefix() default NoMqDuplicateConsumeConstant.CONSUME_CHECK_KEY_PREFIX;

    /**
     * 指定参与幂等判断的唯一标识符
     * Spring EL表达式字符串
     * 例如：Param传参   @NoMQDuplicateConsume(uniqueKey = "#messageId")   表示只使用messageId参数
     *      Body传参    @NoMQDuplicateConsume(uniqueKey = "#user.messageId")  表示只使用user对象下的messageId参数
     *      数组        @NoMQDuplicateConsume(uniqueKey = "#messageExt.properties['messageId']")
     *
     */
    String uniqueKey();

    /**
     * 防重令牌 Key 过期时间，单位：秒
     * 默认 24 小时（86400 秒）
     */
    long keyTimeout() default 86400L;
}
